#include "Buffer.h"
#include <cstring>

Buffer::Buffer(uint16_t sep)
    : sep_(sep)
{
    // 构造函数，可以做初始化（当前不需要）
}

Buffer::~Buffer()
{
    // 析构函数，如果有资源释放，可以处理（当前不需要）
}

void Buffer::append(const char *data, size_t size)
{
    buf_.append(data, size); // 追加数据到 string 末尾
}

size_t Buffer::size()
{
    return buf_.size(); // 返回当前缓冲区大小
}

const char *Buffer::data()
{
    return buf_.data(); // 返回数据首地址（只读）
}

void Buffer::clear()
{
    buf_.clear(); // 清空缓冲区
}

void Buffer::erase(int pos, int nn)
{
    buf_.erase(pos, nn);
}

void Buffer::appendwithsep(const char *data, size_t size)
{
    if (sep_ == 0)
    {
        buf_.append(data, size);
    }
    else if (sep_ == 1)
    {
        buf_.append((char *)&size, 4);
        buf_.append(data, size);
    }
    else if (sep_ == 2)
    {
        buf_.append(data, size);
        buf_.append("\r\n\r\n", 4);
    }
}

bool Buffer::pickmessage(std::string &ss)
{
    if (buf_.size() == 0)
        return false; // 空缓冲区直接返回失败

    if (sep_ == 0)
    {              // 无分隔符模式
        ss = buf_; // 直接移交全部数据
        buf_.clear();
    }
    else if (sep_ == 1)
    { // 四字节报头模式
        int len;
        memcpy(&len, buf_.data(), 4); // 读取报文长度头

        if (buf_.size() < len + 4) // 检查数据完整性
            return false;

        ss.assign(buf_.data() + 4, len); // 提取报文内容
        buf_.erase(0, len + 4);          // 移除已处理数据
    }
    else if (sep_ == 2)
    {
        size_t pos = buf_.find("\r\n\r\n");
        if (pos == std::string::npos)
            return false;
        ss.assign(buf_.data(), pos);
        buf_.erase(0, pos + 4); // 包括分隔符
        return true;
    }
    return true;
}